package org.dllwh.mongo;

import cn.hutool.core.lang.Console;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.InsertManyResult;
import com.mongodb.client.result.InsertOneResult;
import com.mongodb.client.result.UpdateResult;
import org.bson.Document;
import org.bson.conversions.Bson;

import java.util.ArrayList;
import java.util.List;

/**
 * 把今天最好的表现当作明天最新的起点．．～
 * <p>
 * Today the best performance as tomorrow the newest starter!
 *
 * @ClassName MongoDocument
 * @Description MongoDB 文档操作类
 * @Author: <a href="mailto:duleilewuhen@sina.com">独泪了无痕</a>
 * @Date 2025-08-31 01:56
 * @版本 V 1.0.1
 * @since JDK 17
 */
public class MongoDocumentHelper {
    /**
     * 插入单条数据。
     */
    public static void insertOne(String databaseName, String collectionName, Document document) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        InsertOneResult insertOneResult = collection.insertOne(document);
        Console.log("添加单个文档结果：{}", insertOneResult);
        // 返回插入的文档的 _id 值
        Console.log("插入的文档的 _id 值：{}", insertOneResult.getInsertedId());
    }


    /**
     * 批量插入数据
     *
     * @param databaseName   数据库名称
     * @param collectionName 集合名称
     * @param documents
     */
    public static void insertMany(String databaseName, String collectionName, List<Document> documents) {
        MongoCollection<Document> mongoCollection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        InsertManyResult insertManyResult = mongoCollection.insertMany(documents);
        Console.log("文档的批量添加结果：{}", insertManyResult);
    }

    /**
     * 查询单条记录，返回符合条件的第一条文档。
     *
     * @param databaseName   数据库名称
     * @param collectionName 集合名称
     * @param filter
     */
    public static Document findOne(String databaseName, String collectionName, Bson filter) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        return collection.find(filter).first();
    }

    /**
     * 查询集合中的所有文档。
     *
     * @param databaseName   数据库名称
     * @param collectionName 集合名称
     */
    public static List<Document> findAll(String databaseName, String collectionName) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        return collection.find().into(new ArrayList<>());
    }

    /**
     * 查询集合中的所有文档，并返回指定字段。
     *
     * @param databaseName   数据库名称
     * @param collectionName 集合名称
     * @param filter
     */
    public static List<Document> find(String databaseName, String collectionName, Bson filter) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        return collection.find(filter).into(new ArrayList<>());
    }

    /**
     * 查询数据
     */
    public static List<Document> find(String databaseName, String collectionName, Document query, Document projection) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        return collection.find(query).projection(projection).into(new ArrayList<>());
    }

    /**
     * 更新符合条件的第一条记录。
     *
     * @param databaseName   数据库名称
     * @param collectionName 集合名称
     * @param query
     * @param update
     */
    public static void updateOne(String databaseName, String collectionName, Document query, Document update) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        UpdateResult updateResult = collection.updateOne(query, update);
        Console.log("更新单个文档结果：{}", updateResult);
    }

    public static void updateOne(String databaseName, String collectionName, Bson filter, Bson update) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        UpdateResult updateResult = collection.updateOne(filter, update);
        Console.log("更新单个文档结果：{}", updateResult);
    }

    /**
     * 更新所有符合条件的记录。
     *
     * @param databaseName   数据库名称
     * @param collectionName 集合名称
     * @param query
     * @param update
     */
    public static void updateMany(String databaseName, String collectionName, Document query, Document update) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        UpdateResult updateResult = collection.updateMany(query, update);
        Console.log("更新多个文档结果：{}", updateResult);

    }

    public static void updateMany(String databaseName, String collectionName, Bson filter, Bson update) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        UpdateResult updateResult = collection.updateMany(filter, update);
        Console.log("更新多个文档结果：{}", updateResult);
    }

    /**
     * 删除符合条件的第一条记录。
     *
     * @param databaseName   数据库名称
     * @param collectionName 集合名称
     * @param query
     */
    public static void deleteOne(String databaseName, String collectionName, Document query) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        DeleteResult deleteResult = collection.deleteOne(query);
        Console.log("删除符合条件的第一条记录结果：{}", deleteResult);
    }

    public static void deleteOne(String databaseName, String collectionName, Bson filter) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        DeleteResult deleteResult = collection.deleteOne(filter);
        Console.log("删除符合条件的第一条记录结果：{}", deleteResult);
    }

    /**
     * 删除所有符合条件的记录。
     *
     * @param databaseName   数据库名称
     * @param collectionName 集合名称
     * @param query
     */
    public static void deleteMany(String databaseName, String collectionName, Document query) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        DeleteResult deleteResult = collection.deleteMany(query);
        Console.log("删除所有符合条件的记录结果：{}", deleteResult);
    }

    public static void deleteMany(String databaseName, String collectionName, Bson filter) {
        MongoCollection<Document> collection = MongoCollectionHelper.getCollection(databaseName, collectionName);
        DeleteResult deleteResult = collection.deleteMany(filter);
        Console.log("删除所有符合条件的第一条记录结果：{}", deleteResult);
    }
}
